/*-------------------------------------------------------------------------
 *
 * attmap.h
 *	  PostgreSQL 属性映射的定义
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/access/attmap.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef ATTMAP_H
#define ATTMAP_H

#include "access/attnum.h"
#include "access/tupdesc.h"

/*
 * 属性映射结构
 *
 * 这在一对关系之间映射属性编号，指定为
 * 'input'和'output'（通常是继承的父关系和子关系），
 * 其公共列可能具有不同的属性编号。
 * 这种差异可能是由于在两个关系中列的顺序不同
 * 或两个关系在不同的位置删除了列。
 *
 * 'maplen'被设置为'output'关系的属性数量，
 * 考虑到它的任何删除属性，对应的
 * 'attnums'数组的元素设置为0。
 */
typedef struct AttrMap
{
	AttrNumber *attnums;
	int			maplen;
} AttrMap;

extern AttrMap *make_attrmap(int maplen);
extern void free_attrmap(AttrMap *map);

/* 构建映射的转换例程 */
extern AttrMap *build_attrmap_by_name(TupleDesc indesc,
									  TupleDesc outdesc);
extern AttrMap *build_attrmap_by_name_if_req(TupleDesc indesc,
											 TupleDesc outdesc);
extern AttrMap *build_attrmap_by_position(TupleDesc indesc,
										  TupleDesc outdesc,
										  const char *msg);

#endif							/* ATTMAP_H */
